require "import"
import "android.widget.*"
import "android.view.*"
import "cjson"
import "os"
import "android.app.AlertDialog"
import "android.widget.PopupMenu"
import "android.content.Context"

-- URL base da AwesomeAPI
local exchangeRateApiUrlBase = "https://economia.awesomeapi.com.br/last/"
local moedaBaseUSD = "USD"
local moedaBaseBRL = "BRL"

-- Função para processar a resposta da API
function processarResposta(jsonData, moedaOrigem, moedaDestino, quantidade)
    local success, dados = pcall(cjson.decode, jsonData)
    if not success then
        return "Erro ao processar dados de câmbio: formato inválido."
    end
    
    local chavePar = moedaOrigem .. moedaDestino
    if not dados[chavePar] then
        return "Erro: Dados da cotação para " .. moedaOrigem .. "-" .. moedaDestino .. " não encontrados."
    end
    
    local cotacao = tonumber(dados[chavePar].bid)
    local dataAtualizacao = dados[chavePar].create_date or "Desconhecida"
    local cotacaoFormatada = string.format("%.2f", cotacao)
    local valorConvertido = cotacao * (quantidade or 1)
    local valorConvertidoFormatado = string.format("%.2f", valorConvertido)
    
    return string.format(
        "💰 Cotação atual de %s para %s:\n\n" ..
        "%s %d = %s %s\n" ..
        "Cotação unitária: %s 1 = %s %s\n" ..
        "Última atualização: %s\n",
        dados[chavePar].code, dados[chavePar].codein, dados[chavePar].code, quantidade or 1, dados[chavePar].codein, valorConvertidoFormatado, dados[chavePar].code, cotacaoFormatada, dados[chavePar].codein, dataAtualizacao
    )
end

-- Lista das 20 principais moedas (códigos ISO 4217)
local moedas = {
    "EUR", "JPY", "GBP", "CAD", "AUD", "CHF", "CNY", "INR", "RUB", "MXN", 
    "ZAR", "KRW", "NZD", "SGD", "USD", "TRY", "ARS", "CLP", "COP", "THB"
}

-- Variável para armazenar a moeda selecionada
local moedaSelecionadaAtual = "EUR" -- Valor inicial

-- Layout da interface ajustado
layout = {
    LinearLayout;
    orientation = "vertical";
    layout_width = "match_parent";
    layout_height = "match_parent";
    backgroundColor = "#000000";
    padding = "10dp";
    {
        ScrollView;
        layout_width = "match_parent";
        layout_height = "0dp";
        layout_weight = "1";
        {
            LinearLayout;
            orientation = "vertical";
            layout_width = "match_parent";
            layout_height = "wrap_content";
            {TextView;
                id = "textoResposta";
                layout_width = "match_parent";
                layout_height = "wrap_content";
                text = "Seja bem-vindo ao Cotação Fácil. Clique em 'USD-BRL' ou selecione uma moeda e clique em 'Ver Cotação'.",
                textSize = "16sp";
                textColor = "#ffffff";
                padding = "10dp";};
        };
    };
    {
        Button;
        text = "USD-BRL";
        id = "botaoPesquisar";
        textColor = "#ffffff";
        backgroundColor = "#00AA00";
        layout_width = "wrap_content";
        layout_height = "wrap_content";
        layout_marginBottom = "10dp";
        onClick = function(view)
            botaoPesquisar.setEnabled(false)
            botaoOutraMoeda.setEnabled(false)
            textoResposta.setText("Verificando a cotação, por favor aguarde...")
            service.speak("Verificando a cotação, por favor aguarde...")
            
            local url = exchangeRateApiUrlBase .. "USD-BRL"
            Http.get(url, function(status, dados)
                botaoPesquisar.setEnabled(true)
                botaoOutraMoeda.setEnabled(true)
                
                if status == 200 and dados then
                    local quantidade = tonumber(editQuantidade.getText().toString()) or 1
                    local dadosProcessados = processarResposta(dados, "USD", "BRL", quantidade)
                    textoResposta.setText(dadosProcessados)
                    botaoMoedaSelecionada.setText("Escolha a Moeda 1 de 20 USD")
                    moedaSelecionadaAtual = "USD"
                    local cotacao = dadosProcessados:match("USD %d+ = [%d.]+ BRL")
                    if cotacao then
                        service.speak("Cotação do dólar: " .. cotacao)
                    else
                        service.speak("Erro ao obter a cotação.")
                    end
                else
                    textoResposta.setText("Erro ao conectar à API.")
                    service.speak("Erro ao conectar à API.")
                end
            end)
        end;
    };
    {
        Button;
        id = "botaoMoedaSelecionada";
        text = "Escolha a Moeda 1 de 20 EUR"; -- Valor inicial
        textColor = "#ffffff";
        backgroundColor = "#555555";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        layout_marginBottom = "10dp";
        onClick = function(view)
            local context = view.getContext()
            local menu = PopupMenu(context, view)
            for i, moeda in ipairs(moedas) do
                menu.getMenu().add(moeda)
            end
            menu.setOnMenuItemClickListener({
                onMenuItemClick = function(item)
                    moedaSelecionadaAtual = item.getTitle()
                    botaoMoedaSelecionada.setText("Escolha a Moeda 1 de 20 " .. moedaSelecionadaAtual)
                    return true
                end
            })
            menu.show()
        end;
    };
    {
        EditText;
        id = "editQuantidade";
        hint = "Digite a quantidade";
        textColor = "#ffffff";
        hintTextColor = "#888888";
        layout_width = "match_parent";
        layout_height = "wrap_content";
        layout_marginBottom = "10dp";
        inputType = "numberDecimal";
    };
    {
        Button;
        text = "Ver Cotação";
        id = "botaoOutraMoeda";
        textColor = "#ffffff";
        backgroundColor = "#0066AA";
        layout_width = "wrap_content";
        layout_height = "wrap_content";
        layout_marginBottom = "10dp";
        onClick = function(view)
            local moedaSelecionada = moedaSelecionadaAtual
            botaoPesquisar.setEnabled(false)
            botaoOutraMoeda.setEnabled(false)
            textoResposta.setText("Verificando a cotação para " .. moedaSelecionada .. ", por favor aguarde...")
            service.speak("Verificando a cotação para " .. moedaSelecionada .. ", por favor aguarde...")
            
            -- Fechar o teclado usando o contexto do view
            local context = view.getContext()
            local imm = context.getSystemService(Context.INPUT_METHOD_SERVICE)
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0)
            
            local url = exchangeRateApiUrlBase .. moedaSelecionada .. "-BRL"
            Http.get(url, function(status, dados)
                botaoPesquisar.setEnabled(true)
                botaoOutraMoeda.setEnabled(true)
                
                if status == 200 and dados then
                    local quantidade = tonumber(editQuantidade.getText().toString()) or 1
                    local dadosProcessados = processarResposta(dados, moedaSelecionada, "BRL", quantidade)
                    textoResposta.setText(dadosProcessados)
                    botaoMoedaSelecionada.setText("Escolha a Moeda 1 de 20 " .. moedaSelecionada)
                    local cotacao = dadosProcessados:match(moedaSelecionada .. " %d+ = [%d.]+ BRL")
                    if cotacao then
                        service.speak("Cotação de " .. moedaSelecionada .. " para Real: " .. cotacao)
                    else
                        service.speak("Erro ao obter a cotação.")
                    end
                else
                    textoResposta.setText("Erro ao conectar à API.")
                    service.speak("Erro ao conectar à API.")
                end
            end)
        end;
    };
    {Button;
        text = "Sair";
        backgroundColor = "#AA0000";
        textColor = "#ffffff";
        layout_width = "wrap_content";
        layout_height = "wrap_content";
        onClick = function()
            dlg.dismiss()
        end};
}

-- Inicialização do diálogo
dlg = LuaDialog()
dlg.setTitle("Cotação Fácil - Desenvolvido por Marcos Souza")
local view = loadlayout(layout)

dlg.setView(view)
dlg.show()

service.speak("Seja bem-vindo ao Cotação Fácil. Clique em 'USD-BRL' ou selecione uma moeda e clique em 'Ver Cotação'.")